package pimmodel;

/*
 * Testklasse zur NotizList
 */
import static org.junit.Assert.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class NotizListTest {

	INotizList notizliste1;
	INotizList notizliste2;

	ArrayList<INotiz> arrayList;

	INotiz notiz1;
	INotiz notiz2;
	INotiz notiz3;
	INotiz notiz4;
	INotiz notiz5;

	@Before
	public void setUp() throws Exception {
		notizliste1 = new NotizList();
		notizliste2 = new NotizList();

		notiz1 = new Notiz("A", "x", null);
		notiz2 = new Notiz("B", "x", null);
		notiz3 = new Notiz("C", "x", null);
		notiz4 = new Notiz("D", "x", null);
		notiz5 = new Notiz("E", "x", null);

		arrayList = new ArrayList<>();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testNotizHinzufuegen() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(notizliste1.size(), 3);
		assertEquals(notizliste1.getNotiz(0), notiz1);
		assertEquals(notizliste1.getNotiz(1), notiz2);
		assertEquals(notizliste1.getNotiz(2), notiz3);

		try {
			notizliste1.notizHinzufuegen(null);
			fail("Notiz-Null-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException notizNull) {
		}
	}

	@Test
	public void testNotizLoeschen() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(notizliste1.size(), 3);
		notizliste1.notizLoeschen(notiz1);
		assertEquals(notizliste1.size(), 2);
		notizliste1.notizLoeschen(notiz2);
		assertEquals(notizliste1.size(), 1);
		notizliste1.notizLoeschen(notiz3);
		assertEquals(notizliste1.size(), 0);
		notizliste1.notizLoeschen(notiz4);
		assertEquals(notizliste1.size(), 0);
	}

	@Test
	public void testNotizBear() {
		notizliste1.notizHinzufuegen(notiz1);
		assertEquals(notizliste1.getNotiz(0), notiz1);
		notizliste1.notizBear(notiz3, notiz1);
		assertEquals(notizliste1.getNotiz(0), notiz3);

		try {
			notizliste1.notizBear(notiz5, notiz1);
			fail("Notiz-nicht-vorhanden-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException notizNull) {
		}
	}

	@Test
	public void testSuchen() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(0, notizliste1.suchen("A"));
		assertEquals(1, notizliste1.suchen("B"));
		assertEquals(2, notizliste1.suchen("C"));
		assertEquals(-1, notizliste1.suchen("D"));
	}

	@Test
	public void testSuchenNotiz() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(0, notizliste1.suchenNotiz(notiz1));
		assertEquals(1, notizliste1.suchenNotiz(notiz2));
		assertEquals(2, notizliste1.suchenNotiz(notiz3));
		assertEquals(-1, notizliste1.suchenNotiz(notiz4));
	}

	@Test
	public void testGetNotiz() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(notizliste1.getNotiz(0), notiz1);
		assertEquals(notizliste1.getNotiz(1), notiz2);
		assertEquals(notizliste1.getNotiz(2), notiz3);

		try {
			notizliste1.getNotiz(3);
			fail("Index-falsch-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException indexFalsch) {

		}

		try {
			notizliste1.getNotiz(-1);
			fail("Index-falsch-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException indexFalsch) {

		}
	}

	@Test
	public void testAllesEntfernen() {
		notizliste1.notizHinzufuegen(notiz5);
		notizliste1.notizHinzufuegen(notiz4);
		notizliste1.notizHinzufuegen(notiz3);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz1);
		assertEquals(notizliste1.size(), 5);
		notizliste1.allesEntfernen();
		assertEquals(notizliste1.size(), 0);
	}

	@Test
	public void testSortieren() {
		notizliste1.notizHinzufuegen(notiz5);
		notizliste1.notizHinzufuegen(notiz4);
		notizliste1.notizHinzufuegen(notiz3);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz1);
		assertEquals(notiz5, notizliste1.getNotiz(0));
		assertEquals(notiz4, notizliste1.getNotiz(1));
		assertEquals(notiz3, notizliste1.getNotiz(2));
		assertEquals(notiz2, notizliste1.getNotiz(3));
		assertEquals(notiz1, notizliste1.getNotiz(4));

		notizliste1.sortieren();
		assertEquals(notiz1, notizliste1.getNotiz(0));
		assertEquals(notiz2, notizliste1.getNotiz(1));
		assertEquals(notiz3, notizliste1.getNotiz(2));
		assertEquals(notiz4, notizliste1.getNotiz(3));
		assertEquals(notiz5, notizliste1.getNotiz(4));

		notizliste1.allesEntfernen();
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz4);
		notizliste1.notizHinzufuegen(notiz3);
		notizliste1.notizHinzufuegen(notiz5);
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.sortieren();
		assertEquals(notiz1, notizliste1.getNotiz(0));
		assertEquals(notiz2, notizliste1.getNotiz(1));
		assertEquals(notiz3, notizliste1.getNotiz(2));
		assertEquals(notiz4, notizliste1.getNotiz(3));
		assertEquals(notiz5, notizliste1.getNotiz(4));

		notizliste1.allesEntfernen();
		notizliste1.notizHinzufuegen(notiz1);
		assertEquals(notiz1, notizliste1.getNotiz(0));
		notizliste1.sortieren();
		assertEquals(notiz1, notizliste1.getNotiz(0));
		assertEquals(1, notizliste1.size());
	}

	@Test
	public void testGetNotizliste() {
		arrayList.add(notiz1);
		arrayList.add(notiz2);
		arrayList.add(notiz3);

		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);

		assertEquals(arrayList, notizliste1.getNotizliste());
	}

	@Test
	public void testSetNotizliste() {
		arrayList.add(notiz1);
		arrayList.add(notiz2);
		arrayList.add(notiz3);

		assertEquals(0, notizliste1.size());
		notizliste1.setNotizliste(arrayList);
		assertEquals(3, notizliste1.size());
	}

	@Test
	public void testSize() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(notizliste1.size(), 3);
		notizliste1.notizLoeschen(notiz1);
		assertEquals(notizliste1.size(), 2);
		notizliste1.notizLoeschen(notiz2);
		assertEquals(notizliste1.size(), 1);
		notizliste1.notizLoeschen(notiz3);
		assertEquals(notizliste1.size(), 0);
		notizliste1.notizLoeschen(notiz4);
		assertEquals(notizliste1.size(), 0);
	}

	@Test
	public void testSucheKleinsteNotiz() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		notizliste1.notizHinzufuegen(notiz5);
		notizliste1.notizHinzufuegen(notiz4);
		assertEquals(notiz1, notizliste1.sucheKleinsteNotiz(0));
		assertEquals(notiz4, notizliste1.sucheKleinsteNotiz(4));
		assertEquals(notiz4, notizliste1.sucheKleinsteNotiz(3));
		assertEquals(notiz2, notizliste1.sucheKleinsteNotiz(1));
	}

	@Test
	public void testVertauscheNotizen() {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		notizliste1.notizHinzufuegen(notiz4);
		notizliste1.notizHinzufuegen(notiz5);
		notizliste1.vertauscheNotizen(notiz2, notiz4);
		notizliste1.vertauscheNotizen(notiz3, notiz5);
		assertEquals(notiz1, notizliste1.getNotiz(0));
		assertEquals(notiz4, notizliste1.getNotiz(1));
		assertEquals(notiz5, notizliste1.getNotiz(2));
		assertEquals(notiz2, notizliste1.getNotiz(3));
		assertEquals(notiz3, notizliste1.getNotiz(4));
	}

	@Test
	public void testSpeichernUndLaden() throws FileNotFoundException, IOException, ClassNotFoundException {
		notizliste1.notizHinzufuegen(notiz1);
		notizliste1.notizHinzufuegen(notiz2);
		notizliste1.notizHinzufuegen(notiz3);
		assertEquals(3, notizliste1.size());

		notizliste2.notizHinzufuegen(notiz4);
		notizliste2.notizHinzufuegen(notiz5);
		assertEquals(2, notizliste2.size());

		notizliste1.speichern();
		notizliste2.laden();

		assertEquals(3, notizliste2.size());
		assertEquals(notiz1, notizliste2.getNotiz(0));
		assertEquals(notiz2, notizliste2.getNotiz(1));
		assertEquals(notiz3, notizliste2.getNotiz(2));
	}
}